home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Interapplication Communication / MoreFinderEvents / TestFinderEvents.c < prev    next >
Encoding:
Text File  |  1996-06-12  |  8.2 KB  |  491 lines  |  [TEXT/CWIE]

  1.     //
  2.     //    Complaints and kudos to:
  3.     //
  4.     //        Pete Gontier
  5.     //        Apple Macintosh Developer Technical Support
  6.     //        <gurgle@apple.com>
  7.     //
  8.  
  9. #define OLDROUTINELOCATIONS        0
  10. #define OLDROUTINENAMES            0
  11. #define SystemSevenOrLater        1
  12.  
  13. #ifndef __FONTS__
  14. #    include <Fonts.h>
  15. #endif
  16.  
  17. #ifndef __DIALOGS__
  18. #    include <Dialogs.h>
  19. #endif
  20.  
  21. #ifndef __RESOURCES__
  22. #    include <Resources.h>
  23. #endif
  24.  
  25. #ifndef __STANDARDFILE__
  26. #    include <StandardFile.h>
  27. #endif
  28.  
  29. #ifndef __APPLEEVENTS__
  30. #    include <AppleEvents.h>
  31. #endif
  32.  
  33. #include "MoreFinderEvents.h"
  34.  
  35. static Boolean gQuitting;
  36.  
  37. static pascal OSErr QuitAppleEventHandler (const AppleEvent *, AppleEvent *, long)
  38. {
  39.     gQuitting = true;
  40.     return noErr;
  41. }
  42.  
  43. static pascal OSErr InitMac (void)
  44. {
  45.     MaxApplZone ( );
  46.     InitGraf (&(qd.thePort));
  47.     InitFonts ( );
  48.     InitWindows ( );
  49.     InitMenus ( );
  50.     TEInit ( );
  51.     InitDialogs (nil);
  52.  
  53.     return noErr;
  54. }
  55.  
  56. static pascal void AppleMenuCommand (short)
  57. {
  58. }
  59.  
  60. static pascal short DlgHookYDProc (short item, DialogRef dRef, void *ydP)
  61. {
  62.     if (GetWRefCon (dRef) == sfMainDialogRefCon)
  63.     {
  64.         if (item == sfHookFirstCall)
  65.         {
  66.             Handle messageDitlH = Get1Resource ('DITL',*(short*)ydP);
  67.             if (!ResError ( ) && messageDitlH)
  68.             {
  69.                 DetachResource (messageDitlH);
  70.                 if (ResError ( ))
  71.                     ReleaseResource (messageDitlH);
  72.                 else
  73.                 {
  74.                     AppendDITL (dRef,messageDitlH,appendDITLBottom);
  75.                     DisposeHandle (messageDitlH);
  76.                 }
  77.             }
  78.         }
  79.     }
  80.  
  81.     return item;
  82. }
  83.  
  84. static pascal OSErr SelectAndAct (pascal OSErr (*actor) (const AliasRecord **), Boolean useParent)
  85. {
  86.     OSErr err = noErr;
  87.  
  88.     StandardFileReply *replyP = (StandardFileReply *) NewPtr (sizeof (StandardFileReply));
  89.     if (!(err = MemError ( )))
  90.     {
  91.         Point sfPoint = { -1, -1 };
  92.         short msgDitlResID = useParent ? 129 : 128;
  93.         CustomGetFile (nil,-1,nil,replyP,sfGetDialogID,sfPoint,DlgHookYDProc,nil,nil,nil,&msgDitlResID);
  94.         if (replyP->sfGood)
  95.         {
  96.             if (!useParent || !(err = FSMakeFSSpec (replyP->sfFile.vRefNum,replyP->sfFile.parID,nil,&(replyP->sfFile))))
  97.             {
  98.                 AliasHandle aliasH = nil;
  99.         
  100.                 if (!(err = NewAliasMinimal (&(replyP->sfFile), &aliasH)))
  101.                 {
  102.                     err = actor (aliasH);
  103.                     DisposeHandle ((Handle) aliasH);
  104.                     if (!err) err = MemError ( );
  105.                 }
  106.             }
  107.         }
  108.         DisposePtr ((Ptr) replyP);
  109.         if (!err) err = MemError ( );
  110.     }
  111.  
  112.     return err;
  113. }
  114.  
  115. static pascal Boolean VolFileFilterYDProc (CInfoPBPtr, void *)
  116. {
  117.     return true;
  118. }
  119.  
  120. static pascal short VolDlgHookYDProc (short item, DialogRef, void *)
  121. {
  122.     switch (item)
  123.     {
  124.         case sfHookFirstCall        :
  125.  
  126.             item = sfHookGoToDesktop;
  127.             break;
  128.  
  129.         case sfHookGoToAliasTarget    :
  130.         case sfHookGoToPrevDrive    :
  131.         case sfHookGoToNextDrive    :
  132.         case sfHookChangeSelection    :
  133.  
  134.             SysBeep (10);
  135.             item = sfHookNullEvent;
  136.             break;
  137.  
  138.         case sfHookOpenFolder        :
  139.  
  140.             item = sfItemOpenButton;
  141.             break;
  142.     }
  143.  
  144.     return item;
  145. }
  146.  
  147. static pascal OSErr ChooseAndUnmount (void)
  148. {
  149.     OSErr err = noErr;
  150.     StandardFileReply reply;
  151.     Point sfWhere = {-1,-1};
  152.     CustomGetFile (VolFileFilterYDProc,-1,nil,&reply,sfGetDialogID,sfWhere,VolDlgHookYDProc,nil,nil,nil,nil);
  153.     if (reply.sfGood)
  154.         err = MFE_UnmountVolume (reply.sfFile.vRefNum);
  155.     return err;
  156. }
  157.  
  158. static pascal OSErr PageSetupAndPrint (const AliasRecord **aliasH)
  159. {
  160.     OSErr err = MFE_PageSetup (aliasH);
  161.     if (!err) err = MFE_PrintWindow (aliasH);
  162.     return err;
  163. }
  164.  
  165. static const AliasRecord **gAliasToDrag;
  166.  
  167. static pascal OSErr MoveFile2 (const AliasRecord **destAlias)
  168. {
  169.     return MFE_Move (gAliasToDrag,destAlias);
  170. }
  171.  
  172. static pascal OSErr CopyFile2 (const AliasRecord **destAlias)
  173. {
  174.     return MFE_Copy (gAliasToDrag,destAlias);
  175. }
  176.  
  177. static pascal OSErr CopyFile (const AliasRecord **aliasToDrag)
  178. {
  179.     gAliasToDrag = aliasToDrag;
  180.     return SelectAndAct (CopyFile2,true);
  181. }
  182.  
  183. static pascal OSErr MoveFile (const AliasRecord **aliasToDrag)
  184. {
  185.     gAliasToDrag = aliasToDrag;
  186.     return SelectAndAct (MoveFile2,true);
  187. }
  188.  
  189. static pascal OSErr FinderMenuCommand (short menuItem)
  190. {
  191.     OSErr err = unimpErr;
  192.  
  193.     enum
  194.     {
  195.         kMenuItem_Title,
  196.  
  197.         kMoveFile,
  198.         kCopyFile,
  199.  
  200.         kMenuItem_Divider2,
  201.  
  202.         kMenuItem_Reveal,
  203.         kMenuItem_OpenParent,
  204.         kMenuItem_CloseParent,
  205.  
  206.         kMenuItem_Divider3,
  207.  
  208.         kMenuItem_PageSetupParent,
  209.         kMenuItem_PrintParent,
  210.  
  211.         kMenuItem_Divider4,
  212.  
  213.         kMenuItem_MakeAlias,
  214.         kMenuItem_Duplicate,
  215.         kMenuItem_OpenSelection,
  216.         kMenuItem_PrintSelection,
  217.  
  218.         kMenuItem_Divider5,
  219.  
  220.         kMenuItem_PutAway,
  221.         kMenuItem_UnmountVol,
  222.  
  223.         kMenuItem_Divider6,
  224.  
  225.         kMenuItem_GetInfo,
  226.         kMenuItem_CloseGetInfo,
  227.  
  228.         kMenuItem_Divider7,
  229.  
  230.         kMenuItem_Sharing,
  231.         kMenuItem_CloseSharing,
  232.  
  233.         kMenuItem_Divider8,
  234.  
  235.         kMenuItem_Sleep,
  236.         kMenuItem_Restart,
  237.         kMenuItem_ShutDown,
  238.  
  239.         kMenuItem_Divider9,
  240.  
  241.         kMenuItem_EmptyTrash,
  242.  
  243.         kMenuItem_Divider10,
  244.  
  245.         kMenuItem_ShowAbout,
  246.         kMenuItem_HideAbout,
  247.  
  248.         kMenuItem_Divider11,
  249.  
  250.         kMenuItem_ShowClip,
  251.         kMenuItem_HideClip
  252.     };
  253.  
  254.     switch (menuItem)
  255.     {
  256.         case kCopyFile :
  257.  
  258.             err = SelectAndAct (CopyFile,false);
  259.             break;
  260.  
  261.         case kMoveFile :
  262.  
  263.             err = SelectAndAct (MoveFile,false);
  264.             break;
  265.  
  266.         case kMenuItem_PutAway :
  267.  
  268.             err = SelectAndAct (MFE_PutAway,false);
  269.             break;
  270.  
  271.         case kMenuItem_MakeAlias :
  272.  
  273.             err = SelectAndAct (MFE_MakeAlias,false);
  274.             break;
  275.  
  276.         case kMenuItem_Duplicate :
  277.  
  278.             err = SelectAndAct (MFE_Duplicate,false);
  279.             break;
  280.  
  281.         case kMenuItem_OpenSelection :
  282.  
  283.             err = SelectAndAct (MFE_OpenSelection,false);
  284.             break;
  285.  
  286.         case kMenuItem_PrintSelection :
  287.  
  288.             err = SelectAndAct (MFE_PrintSelection,false);
  289.             break;
  290.  
  291.         case kMenuItem_PageSetupParent :
  292.  
  293.             err = SelectAndAct (MFE_PageSetup,true);
  294.             break;
  295.  
  296.         case kMenuItem_PrintParent :
  297.  
  298.             err = SelectAndAct (PageSetupAndPrint,true);
  299.             break;
  300.  
  301.         case kMenuItem_OpenParent :
  302.  
  303.             err = SelectAndAct (MFE_OpenSelection,true);
  304.             break;
  305.  
  306.         case kMenuItem_CloseParent :
  307.  
  308.             err = SelectAndAct (MFE_CloseWindow,true);
  309.             break;
  310.  
  311.         case kMenuItem_CloseGetInfo :
  312.  
  313.             err = SelectAndAct (MFE_CloseGetInfo,false);
  314.             break;
  315.  
  316.         case kMenuItem_GetInfo :
  317.  
  318.             err = SelectAndAct (MFE_OpenGetInfo,false);
  319.             break;
  320.  
  321.         case kMenuItem_CloseSharing :
  322.  
  323.             err = SelectAndAct (MFE_CloseSharing,true);
  324.             break;
  325.  
  326.         case kMenuItem_Sharing :
  327.  
  328.             err = SelectAndAct (MFE_OpenSharing,true);
  329.             break;
  330.  
  331.         case kMenuItem_EmptyTrash :
  332.  
  333.             err = MFE_EmptyTrash ( );
  334.             break;
  335.  
  336.         case kMenuItem_ShowAbout :
  337.  
  338.             err = MFE_ShowAbout ( );
  339.             break;
  340.  
  341.         case kMenuItem_HideAbout :
  342.  
  343.             err = MFE_HideAbout ( );
  344.             break;
  345.  
  346.         case kMenuItem_ShowClip :
  347.  
  348.             err = MFE_ShowClipboard ( );
  349.             break;
  350.  
  351.         case kMenuItem_HideClip :
  352.  
  353.             err = MFE_HideClipboard ( );
  354.             break;
  355.  
  356.         case kMenuItem_Reveal :
  357.  
  358.             err = SelectAndAct (MFE_Reveal,false);
  359.             break;
  360.  
  361.         case kMenuItem_UnmountVol :
  362.  
  363.             err = ChooseAndUnmount ( );
  364.             break;
  365.  
  366.         case kMenuItem_Sleep :
  367.  
  368.             err = MFE_Sleep ( );
  369.             break;
  370.  
  371.         case kMenuItem_Restart :
  372.  
  373.             err = MFE_Restart ( );
  374.             break;
  375.  
  376.         case kMenuItem_ShutDown :
  377.  
  378.             err = MFE_ShutDown ( );
  379.             break;
  380.     }
  381.  
  382.     return err;
  383. }
  384.  
  385. static pascal void EditMenuCommand (short)
  386. {
  387. }
  388.  
  389. static pascal OSErr Command (long ms)
  390. {
  391.     OSErr err = noErr;
  392.  
  393.     short    menuID = ms >> 16,
  394.             menuItem = ms;
  395.  
  396.     enum
  397.     {
  398.         kMenuID_File = 129,
  399.         kMenuID_Apple,
  400.         kMenuID_Finder,
  401.         kMenuID_Edit
  402.     };
  403.  
  404.     switch (menuID)
  405.     {
  406.         case kMenuID_File :
  407.  
  408.             gQuitting = true;
  409.             break;
  410.  
  411.         case kMenuID_Apple :
  412.  
  413.             AppleMenuCommand (menuItem);
  414.             break;
  415.  
  416.         case kMenuID_Finder :
  417.  
  418.             err = FinderMenuCommand (menuItem);
  419.             break;
  420.  
  421.         case kMenuID_Edit :
  422.  
  423.             EditMenuCommand (menuItem);
  424.             break;
  425.  
  426.     }
  427.  
  428.     return err;
  429. }
  430.  
  431. static pascal OSErr HandleEvent (const EventRecord *eventP)
  432. {
  433.     OSErr err = noErr;
  434.  
  435.     if (eventP->what == kHighLevelEvent)
  436.         AEProcessAppleEvent (eventP);
  437.     else if (eventP->what == mouseDown)
  438.     {
  439.         WindowRef whichWindow;
  440.         short partCode = FindWindow (eventP->where, &whichWindow);
  441.         if (partCode == inMenuBar)
  442.         {
  443.             long ms = MenuSelect (eventP->where);
  444.             if (ms)
  445.                 err = Command (ms);
  446.             HiliteMenu (0);
  447.         }
  448.     }
  449.  
  450.     return err;
  451. }
  452.  
  453. static pascal Boolean SetUpMenuBar (void)
  454. {
  455.     Boolean result = false;
  456.     Handle mBar = GetNewMBar (128);
  457.     if (!ResError ( ) && mBar)
  458.     {
  459.         SetMenuBar (mBar);
  460.         AppendResMenu (GetMenuHandle (130), 'DRVR');
  461.         DrawMenuBar ( );
  462.         result = true;
  463.         ReleaseResource (mBar);
  464.     }
  465.     return result;
  466. }
  467.  
  468. void main (void)
  469. {
  470.     if (!InitMac ( ))
  471.     {
  472.         if (SetUpMenuBar ( ))
  473.         {
  474.             if (!(AEInstallEventHandler (kCoreEventClass, kAEQuitApplication,
  475.                 NewAEEventHandlerProc (QuitAppleEventHandler), 0, false)))
  476.             {
  477.                 do
  478.                 {
  479.                     OSErr err = noErr;
  480.                     EventRecord event;
  481.                     InitCursor ( );
  482.                     WaitNextEvent (everyEvent, &event, -1, nil);
  483.                     err = HandleEvent (&event);
  484.                     if (err) SysBeep (10);
  485.                 }
  486.                 while (!gQuitting);
  487.             }
  488.         }
  489.     }
  490. }
  491.